package com.atde._01_principle.segregation;



/**
 * @Author: Del
 * @CreateTime: 2025-04-12
 * @Description:
 * 结论：
 * 在类中 演示接口隔离原则：
 * 1. 接口的实现应该是最小的，即应该将多个具有不同功能的方法分别进行定义，而不应该把所有的功能都定义在相同的接口中。
 * 2. 此类中的接口 定义了5个方法，其实现的功能都有所不同，并且 B类 和 D类实现类接口 强制实现了接口，而 A类 和 C类 只是需要接口的部分方法 使其都依赖接口，
 * 3. 在本类的做法虽然可以返回部分功能的代码 但是其暴露了不同的功能，导致类A和类C的代码都依赖接口，而类A和类C并不需要接口中的所有功能，
 * 4. 这就违反了接口隔离原则，即接口隔离原则是针对接口的，不是针对具体的类。
 *
 * 解决方法：将接口不同的功能的方法进行拆分，使其只依赖自己需要的功能，而不需要依赖不需要的功能。
 * @Version: 1.0
 */
public class Segregation02 {
    public static void main(String[] args) {
        // 创建一个A1对象
        A1 a1 = new A1();

        // A类通过接口去依赖B类
        a1.depend1(new B1());
        a1.depend2(new B1());
        a1.depend3(new B1());

        // C类通过接口去依赖D类
        C1 c1 = new C1();
        // C类通过接口去依赖(使用)D类
        c1.depend1(new D1());
        c1.depend4(new D1());
        c1.depend5(new D1());
    }
}

interface Interface01 {
    void operation1();
}

interface Interface02 {
    void operation2();
    void operation3();
}

interface Interface03 {
    void operation4();
    void operation5();
}

class B1 implements Interface01, Interface02 {
    public void operation1() {
        System.out.println("B 实现了 operation1");
    }

    public void operation2() {
        System.out.println("B 实现了 operation2");
    }

    public void operation3() {
        System.out.println("B 实现了 operation3");
    }
}


class D1 implements Interface01, Interface03 {
    public void operation1() {
        System.out.println("D 实现了 operation1");
    }

    public void operation4() {
        System.out.println("D 实现了 operation4");
    }

    public void operation5() {
        System.out.println("D 实现了 operation5");
    }
}


class A1 {
    public void depend1(Interface01 i) {
        i.operation1();
    }

    public void depend2(Interface02 i) {
        i.operation2();
    }

    public void depend3(Interface02 i) {
        i.operation3();
    }
}

class C1 {
    public void depend1(Interface01 i) {
        i.operation1();
    }

    public void depend4(Interface03 i) {
        i.operation4();
    }

    public void depend5(Interface03 i) {
        i.operation5();
    }
}
